#ifndef COUNTER_H
#define COUNTER_H

#include <QtCore>
#include <QtSql>

#include <cryptopp/rsa.h>
#include <cryptopp/osrng.h>
#include <cryptopp/files.h>
#include <cryptopp/hex.h>
#include <cryptopp/hmac.h>
#include <string>
#include <pvid_authority.h>

using namespace std;
using namespace CryptoPP;

class Counter
{
public:
// Variables
    QDir obj_Dir;

// Funciones
    Counter();
    Counter(QString Dir);
    Counter(QString Dir, bool no_key);
    ~Counter();
    PVID_Authority *pvid;

    bool Hex2Key(QString keydata, QString keyname);
    bool Key2Hex(QString keyname,QString &keyHex);
    bool M6(QString &m6);

    void SubVoteList();
    void Matching_dz(QString dir_2_dz);
    void SimplifiedList();
    void ResultsList(QString dir_2_B);
    void ResumenResultadosProp(QString dir_propuestas, QString desc,QString &str_opciones,QString &num_opciones);
    void ResumenResultadosMoc(QString dir_mociones, QString desc,QString &str_opciones,QString &num_opciones);
    QString shift_String(QString &msg);
    QString shift_String(QString &msg,int max);
    int unVoted();

private:
//Variables
    AutoSeededRandomPool rng;

//Funciones
    void create_key();

    void Save(QString &filename, const BufferedTransformation& bt);
    void SavePrivateKey(QString &filename, const PrivateKey& key);
    void SavePublicKey(QString &filename, const PublicKey& key);

    void Load(QString filename, BufferedTransformation& bt);
    void LoadPrivateKey(QString filename, PrivateKey& key);
    void LoadPublicKey(QString filename, PublicKey& key);



    QString encryptMsg(QString Data,QString keyname);
    bool decryptMsg(QString key2use,QString &Data, QString &decryptedMsg);

    QString Hash(QString H);
    bool Save_Hash(QString Ez);
    bool Save_in_VL(QString PVID, QString Ez, QString ev);
    //bool PVID_verification(QString PVID);

};

#endif // COUNTER_H
